import {ResType} from '../types/res-type.ts'
import {ResObjPropNameConst} from '../consts/res-prop-name-const.ts'

/**
 * 生成响应结果对象
 *
 * @param {boolean} status 响应状态，默认 true，表示成功；false 表示失败
 * @param {string} message 响应描述信息，默认 '成功'
 * @param data 响应数据
 * @param {boolean} isEncrypt 响应数据是否加密，默认 undefined，不往响应结果对象中添加 {@link ResObjPropNameConst.IS_ENCRYPT} 属性
 * @param {boolean} isJsonStringify 响应数据是否 JSON 序列化处理，默认 undefined，不往响应结果对象中添加 {@link ResObjPropNameConst.IS_JSON_STRINGIFY} 属性
 * @returns {ResType} 响应结果对象
 */
export const genRes = (
  {
    status = true,
    message = '成功',
    data = null,
    isEncrypt,
    isJsonStringify,
  }: {
    [ResObjPropNameConst.STATUS]?: boolean;
    [ResObjPropNameConst.MESSAGE]?: string;
    [ResObjPropNameConst.DATA]?: any;
    [ResObjPropNameConst.IS_ENCRYPT]?: boolean;
    [ResObjPropNameConst.IS_JSON_STRINGIFY]?: boolean;
  }
) => {
  const res: ResType = {
    [ResObjPropNameConst.STATUS]: status,
    [ResObjPropNameConst.MESSAGE]: message,
    [ResObjPropNameConst.DATA]: data,
  } as ResType
  if (typeof isEncrypt !== 'undefined') res[ResObjPropNameConst.IS_ENCRYPT] = isEncrypt
  if (typeof isJsonStringify !== 'undefined') res[ResObjPropNameConst.IS_JSON_STRINGIFY] = isJsonStringify
  return res
}

/**
 * 生成成功响应结果对象
 *
 * @param {string} message 响应描述信息，默认 '成功'
 * @param data 响应数据
 * @param {boolean} isEncrypt 响应数据是否加密，默认 undefined，不往响应结果对象中添加 {@link ResObjPropNameConst.IS_ENCRYPT} 属性
 * @param {boolean} isJsonStringify 响应数据是否 JSON 序列化处理，默认 undefined，不往响应结果对象中添加 {@link ResObjPropNameConst.IS_JSON_STRINGIFY} 属性
 * @returns {ResType} 成功响应结果对象
 */
export const genSuccessRes = (message: string = '成功', data?: any, isEncrypt?: boolean, isJsonStringify?: boolean) => {
  return genRes({
    [ResObjPropNameConst.STATUS]: true,
    [ResObjPropNameConst.MESSAGE]: message,
    [ResObjPropNameConst.DATA]: data,
    [ResObjPropNameConst.IS_ENCRYPT]: isEncrypt,
    [ResObjPropNameConst.IS_JSON_STRINGIFY]: isJsonStringify,
  } as Parameters<typeof genRes>[0])
}

/**
 * 生成失败响应结果对象
 *
 * @param {string} message 响应描述信息，默认 '失败'
 * @param data 响应数据
 * @param {boolean} isEncrypt 响应数据是否加密，默认 undefined，不往响应结果对象中添加 {@link ResObjPropNameConst.IS_ENCRYPT} 属性
 * @param {boolean} isJsonStringify 响应数据是否 JSON 序列化处理，默认 undefined，不往响应结果对象中添加 {@link ResObjPropNameConst.IS_JSON_STRINGIFY} 属性
 * @returns {ResType} 失败响应结果对象
 */
export const genFailRes = (message: string = '失败', data?: any, isEncrypt?: boolean, isJsonStringify?: boolean) => {
  return genRes({
    [ResObjPropNameConst.STATUS]: false,
    [ResObjPropNameConst.MESSAGE]: message,
    [ResObjPropNameConst.DATA]: data,
    [ResObjPropNameConst.IS_ENCRYPT]: isEncrypt,
    [ResObjPropNameConst.IS_JSON_STRINGIFY]: isJsonStringify,
  } as Parameters<typeof genRes>[0])
}


